const Joi = require('joi');

// 通用验证中间件
const validate = (schema, property = 'body') => {
  return (req, res, next) => {
    const { error, value } = schema.validate(req[property], {
      abortEarly: false, // 显示所有验证错误
      allowUnknown: true, // 允许未知字段
      stripUnknown: true // 移除未知字段
    });

    if (error) {
      const errorMessages = error.details.map(detail => detail.message);
      return res.status(400).json({
        success: false,
        message: '数据验证失败',
        code: 400,
        data: {
          errors: errorMessages
        }
      });
    }

    // 将验证后的数据替换原始数据
    req[property] = value;
    next();
  };
};

// 用户注册验证
const registerValidation = Joi.object({
  name: Joi.string()
    .trim()
    .min(2)
    .max(50)
    .required()
    .messages({
      'string.empty': '用户姓名不能为空',
      'string.min': '用户姓名至少需要2个字符',
      'string.max': '用户姓名不能超过50个字符',
      'any.required': '用户姓名是必填项'
    }),
  
  phone: Joi.string()
    .pattern(/^1[3-9]\d{9}$/)
    .required()
    .messages({
      'string.pattern.base': '请输入有效的手机号码',
      'any.required': '手机号码是必填项'
    }),
  
  password: Joi.string()
    .min(6)
    .max(50)
    .required()
    .messages({
      'string.min': '密码至少需要6个字符',
      'string.max': '密码不能超过50个字符',
      'any.required': '密码是必填项'
    }),
  
  role: Joi.string()
    .valid('user', 'maintainer', 'admin')
    .default('user'),
  
  email: Joi.string()
    .email()
    .allow(''),
  
  address: Joi.string()
    .max(200)
    .allow('')
});

// 用户登录验证
const loginValidation = Joi.object({
  phone: Joi.string()
    .pattern(/^1[3-9]\d{9}$/)
    .required()
    .messages({
      'string.pattern.base': '请输入有效的手机号码',
      'any.required': '手机号码是必填项'
    }),
  
  password: Joi.string()
    .required()
    .messages({
      'any.required': '密码是必填项'
    })
});

// 工单创建验证
const createOrderValidation = Joi.object({
  title: Joi.string()
    .trim()
    .min(2)
    .max(100)
    .required()
    .messages({
      'string.empty': '工单标题不能为空',
      'string.min': '工单标题至少需要2个字符',
      'string.max': '工单标题不能超过100个字符',
      'any.required': '工单标题是必填项'
    }),
  
  description: Joi.string()
    .trim()
    .min(10)
    .max(1000)
    .required()
    .messages({
      'string.empty': '工单描述不能为空',
      'string.min': '工单描述至少需要10个字符',
      'string.max': '工单描述不能超过1000个字符',
      'any.required': '工单描述是必填项'
    }),
  
  type: Joi.string()
    .valid('repair', 'maintenance', 'installation', 'other')
    .required()
    .messages({
      'any.only': '工单类型只能是 repair、maintenance、installation 或 other',
      'any.required': '工单类型是必填项'
    }),
  
  urgency: Joi.string()
    .valid('low', 'medium', 'high', 'urgent')
    .default('medium'),
  
  userAddress: Joi.string()
    .trim()
    .min(5)
    .max(200)
    .required()
    .messages({
      'string.empty': '用户地址不能为空',
      'string.min': '用户地址至少需要5个字符',
      'string.max': '用户地址不能超过200个字符',
      'any.required': '用户地址是必填项'
    }),
  
  images: Joi.array()
    .items(Joi.string().uri())
    .max(10)
    .default([]),
  
  documents: Joi.array()
    .items(Joi.string().uri())
    .max(5)
    .default([])
});

// 工单状态更新验证
const updateOrderStatusValidation = Joi.object({
  status: Joi.string()
    .valid('waiting', 'processing', 'waitingPayment', 'completed', 'cancelled', 'evaluating', 'evaluated')
    .required()
    .messages({
      'any.only': '工单状态无效',
      'any.required': '工单状态是必填项'
    }),
  
  notes: Joi.string()
    .max(500)
    .allow(''),
  
  serviceFee: Joi.number()
    .min(0)
    .when('status', {
      is: Joi.valid('waitingPayment', 'completed'),
      then: Joi.required(),
      otherwise: Joi.optional()
    }),
  
  serviceDescription: Joi.string()
    .max(500)
    .when('status', {
      is: Joi.valid('waitingPayment', 'completed'),
      then: Joi.required(),
      otherwise: Joi.allow('')
    })
});

// 工单派发验证
const assignOrderValidation = Joi.object({
  maintainerId: Joi.string()
    .pattern(/^[0-9a-fA-F]{24}$/)
    .required()
    .messages({
      'string.pattern.base': '维修员ID格式无效',
      'any.required': '维修员ID是必填项'
    }),
  
  notes: Joi.string()
    .max(500)
    .allow('')
});

// 工单评价验证
const evaluateOrderValidation = Joi.object({
  rating: Joi.number()
    .integer()
    .min(1)
    .max(5)
    .required()
    .messages({
      'number.min': '评分不能低于1',
      'number.max': '评分不能高于5',
      'any.required': '评分是必填项'
    }),
  
  feedback: Joi.string()
    .max(500)
    .allow('')
});

// 分页验证
const paginationValidation = Joi.object({
  page: Joi.number()
    .integer()
    .min(1)
    .default(1),
  
  pageSize: Joi.number()
    .integer()
    .min(1)
    .max(100)
    .default(20)
});

// MongoDB ObjectId验证
const objectIdValidation = Joi.string()
  .pattern(/^[0-9a-fA-F]{24}$/)
  .messages({
    'string.pattern.base': 'ID格式无效'
  });

module.exports = {
  validate,
  registerValidation,
  loginValidation,
  createOrderValidation,
  updateOrderStatusValidation,
  assignOrderValidation,
  evaluateOrderValidation,
  paginationValidation,
  objectIdValidation
};